package com.chuxing.security.service.impl;

import com.chuxing.config.EmailConfig;
import com.chuxing.domain.DTO.SendCodeDTO;
import com.chuxing.exception.UnauthorizedException;
import com.chuxing.security.service.EmailService;
import com.chuxing.utils.RedisCache;
import lombok.RequiredArgsConstructor;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * @author LiuQi
 * @create 2024-11-19-下午2:08
 */
@Service
@RequiredArgsConstructor
public class EmailServiceImpl implements EmailService {

    private final EmailConfig emailConfig;
    private final RedisCache redisCache;
    private final JavaMailSender mailSender;

    /**
     * 发送验证码邮件
     * 该方法用于生成一个6位的验证码，包括数字、大写字母和小写字母，并将其发送到用户提供的电子邮件地址
     * 验证码通过Redis缓存保存5分钟，以供后续验证使用
     * @param sendCodeDTO 包含用户输入的电子邮件地址的DTO对象
     */
    @Override
    public void sendCode(SendCodeDTO sendCodeDTO) {
        long expire = redisCache.getExpire("email" + sendCodeDTO.getEmail());
        if(expire > 60*4){
            throw new UnauthorizedException("请求频繁，请稍后重试！！！");
        }
        try {
            //收件人信息
            String to = sendCodeDTO.getEmail();
            //邮件标题
            String title = "【卓越班报名系统】 邮箱验证码";
            //邮箱正文
            StringBuilder codes = new StringBuilder();
            Random random = new Random();
            //2.定义一个for循环，随机n次，随机生成字符
            for(int i=0;i<6;i++) {
                //3.生成随机字符，可能是数字，大写字母，小写字母
                int num = random.nextInt(3);
                switch (num) {
                    case 0:
                        //数字:0-9
                        codes.append(random.nextInt(10));
                        break;
                    case 1:
                        //大写字母:A(65)-Z(65+25)
                        char ch1 = (char) (random.nextInt(26) + 65);
                        codes.append(ch1);
                        break;
                    case 2:
                        //小写字母:a(97)-z(97+25)
                        char ch2 = (char) (random.nextInt(26) + 97);
                        codes.append(ch2);
                        break;
                }
            }
            //将生成的验证码缓存到Redis中，有效期为5分钟
            redisCache.setCacheObject("email"+to, codes.toString(),5, TimeUnit.MINUTES);
            //打印生成的验证码，用于调试
            System.out.println(codes);
            //构造邮件正文内容
            String context = "验证码："+codes+"，邮箱验证码5分钟内有效【软件工程卓越班】";
            //发送邮箱
            SimpleMailMessage message = new SimpleMailMessage();
            //发件人
            message.setFrom(emailConfig.getEmailFrom());
            //收件人
            message.setTo(to);
            //邮件标题
            message.setSubject(title);
            //邮件正文
            message.setText(context);
            mailSender.send(message);
        } catch (MailException e) {
            if(e.getMessage().contains("nonexistent account")){
                throw new UnauthorizedException("邮箱不存在");
            }
        }
    }
}
